home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / RAMDSKA2.68K < prev    next >
Text File  |  2001-09-30  |  7KB  |  238 lines

  1. ;RAMDSKA2.68K    JUL-01-88    (ALSO SEE "INFOSTR")
  2. ;RAM DISK HANDLER FOR WRITE-PROTECTED KICKSTART RAM.
  3. ;
  4. ;REVISION HISTORY:
  5. ;
  6. ;INPUTS:
  7. ;    NBLKS:    NUMBER OF BLOCKS TO READ/WRITE
  8. ;    FADDR:    ADDRESS IN MEMORY TO WRITE/READ
  9. ;    BLKNOX:    BLOCK ON THE DISK TO START READ/WRITE
  10.  
  11.     NOLIST
  12.     INCLUDE    SYSPAG
  13.     LIST
  14.  
  15. UNTNUM    EQU    2        ;UNIT NUMBER OF RAM DISK
  16.  
  17. SIZE    EQU    1024 *256    ;MAX SIZE: 1024 BLOCKS
  18.                 ; (ALSO SEE "INFOSTR")
  19. ALTRAM    EQU    $74200        ;BASE ADDRESS OF ALTERNATE RAM SPACE
  20.                 ; HOLDS 6 BLOCKS ($600 BYTES)
  21. SCRBLK    EQU    184        ;BLOCK WHERE SCRATCH.SYS APPEARS
  22.  
  23. BASE0    EQU    $FBFE00        ;BASE ADDRESS OF RAM DISK SPACE
  24. ;THE BOOT BOOT (THE REAL BOOT IN REAL ROM) DOES NOT COPY THE TWO BLOCKS
  25. ; CONTAINING "KICK" INTO RAM, HENCE THE RAM DISK APPEARS TO START AT
  26. ; FBFE00 (= FC0000 - 200). THIS UNIT IS 1024 BLOCKS LONG, AND IT
  27. ; ACTUALLY CONTAINS BLOCKS 2-1025. IN PRACTICE ONLY BLOCKS 9-1023 ARE
  28. ; USED.
  29. ;
  30. ;    DISK    RAM    CONTENTS
  31. ;    0    -    KICK
  32. ;    1    -    0
  33. ;    2    FC0000    BOOT
  34. ;    3    FC0100    0
  35. ;    4-8    FC0200    UNUSED
  36. ;    9-12    FC0700    DIR
  37. ;    13-16    FC0B00    BACKUP DIR
  38. ;    17-1023    FC0F00    NORMAL FILE SPACE
  39. ;    1024    FFFE00    EXTRA BLOCK
  40. ;    1025    FFFF00    EXTRA BLOCK
  41. ;
  42. ;
  43. ;HANDY COMPARISON CHART:
  44. ;     HEX BYTES    MEGA BYTES      BYTES            BLOCKS
  45. ;     $40000        1/4          262,144        1024
  46. ;     $80000        1/2          524,288        2048
  47. ;     $C0000        3/4          786,432        3072
  48. ;    $100000        1        1,048,576        4096
  49.  
  50.     ORG    $7CE00        ;(END OF INTA)
  51. START    EQU    @        ;ADDRESS WHERE THIS HANDLER STARTS
  52.  
  53. ;-----------------------------------------------------------------------
  54. ;
  55. RAMDSK    DC.L    OPEN        ;0
  56.     DC.L    OPEN        ;1
  57.     DC.L    READ        ;2
  58.     DC.L    WRITE        ;3
  59.     DC.L    DUMMY        ;4
  60.     DC.L    GETINFO        ;5
  61.     DC.L    DUMMY        ;6 (SPARE)
  62.     DC.L    DUMMY        ;7 (SPARE)
  63.  
  64. ;-----------------------------------------------------------------------
  65. ;INITIALIZE ALTERNATE MEMORY WITH A COPY OF THE RAM DISK. THE DIRECTORY
  66. ; IS COPIED FROM THE ACTUAL RAM DISK TO ALTERNATE RAM. SCRATCH.SYS IS
  67. ; ASSUMED TO BE INVALID UNLESS SOMETHING HAS BEEN WRITTEN TO IT SINCE
  68. ; BOOTING UP.
  69. ;
  70. OPEN    MOVEM.L    D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS
  71.  
  72.     MOVEA.L    #9*256 +BASE0,A6 ;BLOCK 9 = DIRECTORY
  73.     MOVEA.L    A6,A5        ;A5:= MEMORY ADDRESS, THE REAL RAM DISK
  74.     MOVEQ    #4,D0        ;D0:= NUMBER OF BLOCKS TO WRITE
  75.     MOVEQ    #32,D2        ;USED FOR FAST INCREMENT
  76.     BSR    DOWRITE
  77.  
  78.     MOVEM.L    (SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
  79. DUMMY    RTS
  80.  
  81. ;-----------------------------------------------------------------------
  82. ;READ BYTES FROM RAM DISK AND STORE THEM INTO MEMORY
  83. ;
  84. READ    MOVEM.L    D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS
  85.     BSR    SETUP        ;SET UP D0, D2, A5, AND A6
  86.     BRA.S    RD70        ;ENTER LOOP CHECKING FOR ZERO BLOCKS
  87.  
  88. RD10    CMPA.L    #[SCRBLK+1]*256+BASE0,A6 ;READING ABOVE SCRATCH.SYS?
  89.     BHI.S    RD60        ;BRANCH IF SO -- DO NORMAL READ
  90.     MOVEA.L    A6,A4        ;SET UP POINTER TO ALTERNATE RAM
  91.     CMPA.L    #SCRBLK*256+BASE0,A6 ;READING SCRATCH.SYS?
  92.     BLO.S    RD40        ;BRANCH IF NOT
  93.     ADDA.L    #-[SCRBLK*256+BASE0] +ALTRAM +4*256, A4 ;ALT SCRATCH
  94.     BRA.S    RD50        ;GO MOVE BLOCK FROM ALTERNATE RAM (A4)
  95. RD40
  96.     CMPA.L    #9*256+BASE0,A6    ;READING DIRECTORY?
  97.     BLO.S    RD60        ;BRANCH IF NOT -- DO NORMAL READ
  98.     CMPA.L    #12*256+BASE0,A6
  99.     BHI.S    RD60        ;BRANCH IF NOT -- DO NORMAL READ
  100.     ADDA.L    #-[9*256+BASE0] +ALTRAM, A4 ;POINT TO ALT DIRECTORY
  101.  
  102. ;MOVE A 256-BYTE BLOCK FROM A4 TO A5, MOVE FROM ALTERNATE RAM TO MEMORY:
  103. RD50    MOVEQ    #7,D1        ;8 * 32 = 256 BYTES PER BLOCK
  104. RD55    MOVEM.L    (A4)+,A1-A3/D3-D7 ;READ 32 BYTES AT A4
  105.     MOVEM.L    A1-A3/D3-D7,(A5)  ;WRITE 32 BYTES AT A5
  106.     ADDA.L    D2,A5        ;+32 (POST INCREMENTING IS NOT ALLOWED)
  107.     DBF    D1,RD55        ;LOOP UNTIL ONE BLOCK IS MOVED
  108.  
  109.     ADDA.L    #256,A6        ;MOVE DISK POINTER TO NEXT BLOCK
  110.     BRA.S    RD70        ;GO CHECK FOR NEXT BLOCK
  111.  
  112. ;MOVE A 256-BYTE BLOCK FROM A6 TO A5, MOVE FROM DISK TO MEMORY:
  113. RD60    MOVEQ    #7,D1        ;8 * 32 = 256 BYTES PER BLOCK
  114. RD65    MOVEM.L    (A6)+,A1-A3/D3-D7 ;READ 32 BYTES AT A6
  115.     MOVEM.L    A1-A3/D3-D7,(A5)  ;WRITE 32 BYTES AT A5
  116.     ADDA.L    D2,A5        ;+32 (POST INCREMENTING IS NOT ALLOWED)
  117.     DBF    D1,RD65        ;LOOP UNTIL ONE BLOCK IS MOVED
  118.  
  119. RD70    DBF    D0,RD10        ;DECREMENT BLOCK COUNT AND LOOP
  120.  
  121.     MOVEM.L    (SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
  122.     RTS
  123.  
  124. ;-----------------------------------------------------------------------
  125. ;WRITE BYTES FROM MEMORY ONTO THE RAM DISK.
  126. ;
  127. WRITE    MOVEM.L    D0-D7/A0-A6,-(SP)    ;SAVE ALL REGISTERS
  128.  
  129.     BSR    SETUP        ;SET UP D0, D2, A5, AND A6
  130.     BSR    DOWRITE
  131.  
  132.     MOVEM.L    (SP)+,D0-D7/A0-A6    ;RESTORE ALL REGISTERS
  133.     RTS
  134.  
  135. ;-----------------------------------------------------------------------
  136. ;RETURN THE ADDRESS OF THE INFORMATION BLOCK IN D0.
  137. ;
  138. GETINFO    MOVE.L    #INFO,D0
  139.     RTS
  140.  
  141. INFO    DC.L    START        ;HANDLER START AND END ADDRESSES
  142.     DC.L    END
  143.     DC.L    INFOSTR
  144. INFOSTR    ASCII    'RAMDSKA2  JUL-01-88  Memory, 1024 blocks'
  145.     DC.B    0
  146.  
  147. ;-----------------------------------------------------------------------
  148. ;SET UP REGISTERS.
  149. ; OUTPUTS:
  150. ;    D0 = NUMBER OF BLOCKS
  151. ;    D2 = 32
  152. ;    A5 = MEMORY ADDRESS
  153. ;    A6 = MEMORY ADDRESS ON RAM DISK
  154. ;
  155. SETUP    LEA    BASE0.L,A6    ;A6:= BLKNOX * 256 + BASE
  156.     MOVE.L    BLKNOX,D0    ; = MEMORY ADDRESS IN RAM DISK
  157.     ASL.L    #8,D0
  158.     ADDA.L    D0,A6
  159.  
  160.     MOVEA.L    FADDR,A5    ;A5:= MEMORY ADDRESS
  161.  
  162.     MOVE.L    NBLKS,D0    ;D0:= NBLKS
  163.  
  164.     MOVEQ    #32,D2        ;USED FOR FAST INCREMENT
  165.     RTS
  166.  
  167. ;-----------------------------------------------------------------------
  168. ;WRITE BYTES FROM MEMORY ONTO THE RAM DISK
  169. ; INPUTS:
  170. ;    D0 = NUMBER OF BLOCKS
  171. ;    D2 = 32
  172. ;    A5 = MEMORY ADDRESS
  173. ;    A6 = MEMORY ADDRESS ON RAM DISK
  174. ; VIRTUALLY ALL REGISTERS ARE DISTROYED.
  175. ;
  176. DOWRITE    BRA.S    WR70        ;ENTER LOOP CHECKING FOR ZERO BLOCKS
  177.  
  178. WR10    CMPA.L    #[SCRBLK+1]*256+BASE0,A6 ;READING ABOVE SCRATCH.SYS?
  179.     BHI.S    WR60        ;BRANCH IF SO -- DO NORMAL READ
  180.     MOVEA.L    A6,A4        ;SET UP POINTER TO ALTERNATE RAM
  181.     CMPA.L    #SCRBLK*256+BASE0,A6 ;READING SCRATCH.SYS?
  182.     BLO.S    WR40        ;BRANCH IF NOT
  183.     ADDA.L    #-[SCRBLK*256+BASE0] +ALTRAM +4*256, A4 ;PNT TO ALT SCRATCH
  184.     BRA.S    WR50        ;GO MOVE BLOCK FROM ALTERNATE RAM (A4)
  185. WR40
  186.     CMPA.L    #9*256+BASE0,A6    ;READING DIRECTORY?
  187.     BLO.S    WR60        ;BRANCH IF NOT -- DO NORMAL READ
  188.     CMPA.L    #12*256+BASE0,A6
  189.     BHI.S    WR60        ;BRANCH IF NOT -- DO NORMAL READ
  190.     ADDA.L    #-[9*256+BASE0] +ALTRAM, A4 ;POINT TO ALT DIRECTORY
  191.  
  192. ;MOVE A 256-BYTE BLOCK FROM A5 TO A4, MOVE FROM MEMORY TO ALTERNATE RAM:
  193. WR50    MOVEQ    #7,D1        ;8 * 32 = 256 BYTES PER BLOCK
  194. WR55    MOVEM.L    (A5)+,A1-A3/D3-D7 ;READ 32 BYTES AT A5
  195.     MOVEM.L    A1-A3/D3-D7,(A4)  ;WRITE 32 BYTES AT A4
  196.     ADDA.L    D2,A4        ;+32 (POST INCREMENTING IS NOT ALLOWED)
  197.     DBF    D1,WR55        ;LOOP UNTIL ONE BLOCK IS MOVED
  198.  
  199.     ADDA.L    #256,A6        ;MOVE DISK POINTER TO NEXT BLOCK
  200.     BRA.S    WR70        ;GO CHECK FOR NEXT BLOCK
  201.  
  202. WR60    JSR    VERROR        ;CANNOT WRITE TO KICKSTART RAM
  203.     ASCII    '0 - WRITE PROTECTED'
  204.     DC.B    0
  205.     BRA.S    WR90        ;EXIT
  206.  
  207. WR70    DBF    D0,WR10        ;DECREMENT BLOCK COUNT AND LOOP
  208.  
  209. WR90    RTS
  210.  
  211.  
  212.     IF    @ > $7D000
  213.     ERROR -- FILE IS TOO LONG
  214.     ENDIF
  215.  
  216. END    EQU    @-1        ;ADDRESS OF END OF HANDLER
  217.  
  218. ;======================================================================
  219. ;HOOK THIS HANDLER INTO THE UNIT-HANDLER TABLE
  220. ;
  221.     ORG    4 *UNTNUM +MAXTBL
  222.     DC.L    SIZE /256
  223.  
  224.     ORG    4 *UNTNUM +OFFTBL
  225.     DC.L    0
  226.  
  227.     ORG    4 *UNTNUM +UNTTBL
  228.     DC.L    RAMDSK
  229.  
  230.     END
  231. ;
  232.     ORG    4 *UNTNUM +MAXTBL
  233.     DC.L    SIZE /256
  234.  
  235.     ORG    4 *UNTNUM +OFFTBL
  236.     DC.L    0
  237.  
  238.     ORG